package util;

import java.util.ArrayList;

import model.Barra;

import reports.Result;
import reports.TableModelResult;

public class Util {

	static long timeBegin;

	static long timeEnd;

	public static int numTrocas;

	public static int numComparacoes;

	public static int numMovimentacoes;

	public static TableModelResult model = new TableModelResult(
			new ArrayList<Result>());

	public static void setTimeBegin() {
		timeBegin = System.nanoTime();
	}

	public static void zerarContagem() {
		numComparacoes = 0;
		numTrocas = 0;
		numMovimentacoes = 0;
	}

	public static synchronized void incNumComp() {
		numComparacoes++;
	}

	public static synchronized void incNumTrocas() {
		numTrocas++;
	}

	public static synchronized void incNumMov() {
		numMovimentacoes++;
	}

	public static void setTimeEnd() {
		timeEnd = System.nanoTime();
	}

	public static long getTime() {
		return (timeEnd - timeBegin) / 1000;
	}

	public static String getInfo() {
		return "[" + numTrocas + " trocas ][" + numComparacoes + " compara��es]";
	}

	public static String result() {
		return getInfo();
	}

	public static String result(String currentAlgName) {
		return "[" + currentAlgName + "] " + getInfo();
	}
	
	
	
	public static double[] interpolate(double[] xval, double[] yval) throws Exception {
		
		double xlnsom = 0.0, ylnsom = 0.0, xlnquad = 0.0, ylnquad = 0.0, xlnyln = 0.0, a0 = 0, a1 = 0;

		// recebe a quantidade de elementos passados
		int numElementos = xval.length;
		int c = 0;

		// No ajuste potencial, os pontos que possuirem x ou y negativos ser�o
		// desconsiderados.
		for (int i = 0; i < numElementos; i++) {
			if (!(xval[i] <= 0 || yval[i] <= 0)) {
				xval[c] = xval[i];
				yval[c] = yval[i];
				c += 1;
			}
		}

		if (c <= 1)
			throw new Exception("Grau de liberdade insufiente!");

		for (int i = 0; i < c; i++) {
			xlnsom += Math.log(xval[i]);// soamtorio do ln x
			ylnsom += Math.log(yval[i]);// somatorio do ln y
			xlnquad += Math.log(xval[i]) * Math.log(xval[i]);// somatorio de ln de x ao quadrado
			ylnquad += Math.log(yval[i]) * Math.log(yval[i]);// somatorio de ln de y ao quadrado
			xlnyln += Math.log(xval[i]) * Math.log(yval[i]);// ln de x vezes ln de y
		}

		a0 = (xlnsom * xlnyln - xlnquad * ylnsom ) / (c * xlnquad - xlnsom * xlnsom);// calculo de a0
		a1 = (c * xlnyln - xlnsom * ylnsom) / (c * xlnquad - xlnsom * xlnsom);// calculo de a1

		
		return new double[] { a0, a1 };
	}
	

	/**
	 * Testes ..... N�o funciona corretamente
	 * 
	 * @param <T>
	 * @param t
	 */
	public static <T> void calculaNota(Barra[] t) {
		StringBuilder sb = new StringBuilder();
		double nota = 0;

		for (int i = 0; i < t.length; i++) {
			
			int pos = ((t[i].getAltura() / 10) - 1);
			
			if (i <= pos + 3 && i >= pos - 3 ) {
				nota += 1;
				sb.append("a[" + i + "]: " + t[i] + "***\n");
			} else {
				nota -= 1;
				sb.append("a[" + i + "]: " + t[i] + "\n");
			}

		}
		System.out.println("Nota: " + nota);
		System.out.println(sb.toString());
	}

}